package com.dyzx.hbb.common.utils;

import java.util.regex.Pattern;

/**
 * 验证工具类
 * 提供各种数据格式验证方法
 */
public class ValidUtils {
    /**
     * 验证ISBN号码是否有效（ISBN-10或ISBN-13）
     * @param value 待验证的ISBN字符串
     * @return 是否有效
     */
    public static boolean isValidIsbn(String value) {
        if (value == null || value.isEmpty()) {
            return false;
        }
        // 正则表达式匹配ISBN-10或ISBN-13
        return Pattern.matches("^(\\d{9}X|\\d{13})$", value);
    }
    /**
     * 验证字符串是否为纯数字
     * @param value 待验证的字符串
     * @return 是否为纯数字
     */
    public static boolean isValidNumber(String value) {
        if (value == null || value.isEmpty()) {
            return false;
        }
        // 正则表达式匹配纯数字
        return Pattern.matches("^[0-9]+$", value);
    }

    /**
     * 验证字符串是否为有效的金额格式
     * @param value 待验证的字符串
     * @return 是否为有效的金额格式
     */
    public static boolean isValidMoney(String value) {
        if (value == null || value.isEmpty()) {
            return false;
        }
        // 正则表达式匹配金额格式（数字和小数点）
        // 改进的金额格式验证：允许小数点，但小数点后最多两位
        return Pattern.matches("^\\d+(\\.\\d{1,2})?$", value);
    }
    /**
     * 验证手机号是否有效
     * @param value 待验证的手机号
     * @return 是否为有效的手机号
     */
    public static boolean isValidPhone(String value) {
        if (value == null || value.isEmpty()) {
            return false;
        }
        // 正则表达式匹配中国大陆手机号
        return Pattern.matches("^1[3456789]\\d{9}$", value);
    }
    /**
     * 验证密码是否符合要求
     * 密码必须包含字母、数字、特殊字符中的至少两种
     * @param value 待验证的密码
     * @return 是否为有效的密码
     */
    public static boolean isValidPassword(String value) {
        if (value == null || value.isEmpty()) {
            return false;
        }
        // 正则表达式匹配包含大小写字母、数字、特殊字符的密码
        // 不能全是字母、不能全是数字、不能全是特殊字符
        return Pattern.matches("^(?![a-zA-Z]+$)(?!\\d+$)(?![!@#$%^&*]+$)[a-zA-Z\\d!@#$%^&*]+$", value);
    }
    /**
     * 验证车辆VIN码是否有效
     * @param value 待验证的VIN码
     * @return 是否为有效的VIN码
     */
    public static boolean isValidVin(String value) {
        if (value == null || value.isEmpty()) {
            return false;
        }
        // 正则表达式匹配17位由大写字母和数字组成的VIN码
        return Pattern.matches("^[A-Z0-9]{17}$", value);
    }
    
    /**
     * 验证邮箱格式是否有效
     * @param value 待验证的邮箱
     * @return 是否为有效的邮箱
     */
    public static boolean isValidEmail(String value) {
        if (value == null || value.isEmpty()) {
            return false;
        }
        // 正则表达式匹配邮箱格式
        return Pattern.matches("^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\\.[a-zA-Z0-9_-]+)+$", value);
    }
    
    /**
     * 验证身份证号码是否有效（支持18位二代身份证）
     * @param value 待验证的身份证号码
     * @return 是否为有效的身份证号码
     */
    public static boolean isValidIdCard(String value) {
        if (value == null || value.isEmpty()) {
            return false;
        }
        // 正则表达式匹配18位身份证号码格式（简单格式验证）
        return Pattern.matches("^[1-9]\\d{5}(19|20)\\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\\d|3[01])\\d{3}[0-9Xx]$", value);
    }
    
    /**
     * 验证中国车牌号是否有效（支持新能源车牌）
     * @param value 待验证的车牌号
     * @return 是否为有效的车牌号
     */
    public static boolean isValidLicensePlate(String value) {
        if (value == null || value.isEmpty()) {
            return false;
        }
        // 匹配普通车牌和新能源车牌
        // 普通车牌：省份简称 + 1位字母 + 5位字母或数字
        // 新能源车牌：省份简称 + 1位字母 + 6位字母或数字
        return Pattern.matches("^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领][A-Z][A-Z0-9]{5,6}$", value);
    }

    /**
     * 验证URL格式是否正确
     * @param value 待验证的URL
     * @return 是否为有效的URL
     */
    public static boolean isValidUrl(String value) {
        if (value == null || value.isEmpty()) {
            return false;
        }
        // 正则表达式匹配URL格式
        return Pattern.matches("^(https?|ftp)://[\\w-]+(\\.[\\w-]+)+[\\w-~:/?#@[\\]!$&'()*+,;=.]*$", value);
    }



    /**
     * 验证姓名是否有效（支持中文、英文、空格）
     * @param value 待验证的姓名
     * @return 是否为有效的姓名
     */
    public static boolean isValidCardName(String value) {
        if (value == null || value.isEmpty()) {
            return false;
        }
        // 正则表达式匹配中文、英文、空格
        return Pattern.matches("^[·\\u4e00-\\u9fa5a-zA-Z\\s]+$", value);
    }
}